﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeTop.八股
{
    using System;

    public class Parent
    {
        public virtual void Show()
        {
            Console.WriteLine("Parent Show");
        }
    }

    public class Child : Parent
    {
        // 使用 new 关键字隐藏基类中的方法
        public new void Show()
        {
            
            Console.WriteLine("Child Show");
        }
    }
    public class Child2 : Parent
    {
        // 使用 new 关键字隐藏基类中的方法
        public override  void Show()
        {
            Console.WriteLine("Child2 Show");
        }
    }
    public class Child3 : Parent
    {
        // 使用 new 关键字隐藏基类中的方法
       
    }
    public class Program
    {
        public static void Mainnew()
        {
            Console.WriteLine("孩子new");
            Parent parent = new Parent();
            Parent childAsParent = new Child();
            Child child = new Child();

            parent.Show();             // 输出: Parent Show
            childAsParent.Show();     // 输出: Parent Show,,使用基类指针使用子类方法，但是寻找失败，因为子类没有重写
            child.Show();             // 输出: Child Show



            Console.WriteLine("孩子override");
            Parent child2AsParent = new Child2();
            Child2 child2 = new Child2();
            
            child2AsParent.Show();//把父亲的方法覆盖掉了
            //调用的是孩子的方法，从父亲的虚函数表找到孩子方法的指针
            child2.Show();
            Console.WriteLine("孩子不用方法");

            Parent child3AsParent = new Child3();//找不到子类的方法，调用父类的
            child3AsParent.Show();

        }
    }

}
